{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 文本向量(Embedding)\n",
    "文本向量，是指将一段文本，转化为一定维度的向量（文心百中语义模型中为384维），其中相近语义、相关主题的文本在向量空间更接近。拥有一个良好的文本嵌入特征，对于文本可视化、检索、聚类、内容审核等下游任务，有着重要的意义。\n",
    "\n",
    "ERNIE Bot提供用于生成文本的向量表示的ernie-text-embedding模型。\n",
    "\n",
    "该模型基于文心大模型，使用海量数据训练得到，为文心百中系统提供关键能力。该模型可以将输入文本转为384维浮点数表示的向量。这些向量具备精准的语义表达能力，可用于度量文本之间的语义相似度。\n",
    "\n",
    "使用前，请参考[认证鉴权文档](../../docs/authentication.md)获取要使用的后端的鉴权参数并将其配置为环境变量或者直接指定使用。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import time, math, erniebot, os\n",
    "from typing import List\n",
    "\n",
    "erniebot.api_type = \"aistudio\"\n",
    "erniebot.access_token = \"<eb-access-token>\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. API文档以及调用\n",
    "此文档仅简单介绍相关参数，详情请见[API文档](../../docs/api_reference/embedding.md)\n",
    "\n",
    "Python接口\n",
    "```python\n",
    "erniebot.Embedding.create(**kwargs: Any) -> Union[EBResponse, Iterator[EBResponse]]\n",
    "```\n",
    "\n",
    "<br>\n",
    "输入参数\n",
    "\n",
    "\n",
    "| 参数名 | 类型 | 必填 | 描述 |\n",
    "| :--- | :--- | :------- | :---- |\n",
    "| model  | str | 是 | 模型名称。当前支持`'ernie-text-embedding'`。 |\n",
    "| input | list[str] | 是 | 输入的文本列表，列表中每个元素为一段单独的文本。注意： <br>(1) 列表长度有最大限制。对于ernie-text-embedding模型，列表长度不能超过16。 <br>(2) 每段文本的token数量有最大限制，超出限制则报错（采用`汉字数 + 单词数 * 1.3`估算token数量）。对于ernie-text-embedding模型，每段文本支持最多**384个token**。 <br>(3) 文本内容不能为空。 |\n",
    "| user_id | str | 否 | 终端用户的唯一标识符，可以监视和检测滥用行为，防止接口被恶意调用。 |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Embedding获取\n",
    "\n",
    "**目前API接口可接受的batch_size单次最多支持16个，推荐使用以下函数进行调用，每段文本最多支持384token，后续会完善长文本切割函数使用。**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_embedding(word: List[str]) -> List[float]:\n",
    "    if len(word) <= 16:\n",
    "        embedding = erniebot.Embedding.create(model=\"ernie-text-embedding\", input=word).get_result()\n",
    "    else:\n",
    "        size = len(word)\n",
    "        embedding = []\n",
    "        for i in range(math.ceil(size / 16)):\n",
    "            embedding.extend(\n",
    "                erniebot.Embedding.create(\n",
    "                    model=\"ernie-text-embedding\", input=word[i * 16 : (i + 1) * 16]\n",
    "                ).get_result()\n",
    "            )\n",
    "            time.sleep(1)  # 防止访问频繁报错\n",
    "    return embedding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "已返回16个语义向量\n"
     ]
    }
   ],
   "source": [
    "word = [\n",
    "    \"中国\",\n",
    "    \"北京\",\n",
    "    \"美国\",\n",
    "    \"华盛顿特区\",\n",
    "    \"巴西\",\n",
    "    \"巴西利亚\",\n",
    "    \"俄罗斯\",\n",
    "    \"莫斯科\",\n",
    "    \"法国\",\n",
    "    \"巴黎\",\n",
    "    \"英国\",\n",
    "    \"伦敦\",\n",
    "    \"日本\",\n",
    "    \"东京\",\n",
    "    \"德国\",\n",
    "    \"柏林\",\n",
    "]\n",
    "return_embedding = get_embedding(word)\n",
    "print(f\"已返回{len(return_embedding)}个语义向量\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 效果评测——向量相似度可视化\n",
    "我们使用部分国家以及其首都来测试Embedding的效果，使用TSNE进行降维可视化。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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AADedOed0h13SIcOSWlpUmysefgsAADA+Tw6orRq1Sp16dJFsbGxcjgcmj9/vtv5Xr16yeFwuG2dOnVya3P06FH16NFDERERioqKUu/evXXixAlPdhtACedwSNHRUo0ahCQAAJA7jwalkydP6sorr9TkyZPzbNOpUycdOHAge/voo4/czvfo0UNbtmzR0qVLtXDhQq1atUp9+/b1ZLcBAAAAlHIe/V3qjTfeqBtvvDHfNqGhoYqJicn13NatW7V48WKtW7dOV111lSRp0qRJuummmzRx4kTFxsYWeZ8BAAAAwOfFHFasWKGqVauqXr166t+/v44cOZJ9bvXq1YqKisoOSZKUkJCggIAArV27Ns9rpqWlyel0um0AAAAAUFg+DUqdOnXSe++9p2XLlumll17SypUrdeONNyojI0OSlJycrKpVq7q9JygoSBUrVlRycnKe1x07dqwiIyOzt7i4OI/eBwAAAICSxafLmO++++7s140bN1aTJk102WWXacWKFerQocNFX3fEiBEaMmRI9r7T6SQsAQAAACg0n0+9O1/t2rVVuXJlbd++XZIUExOjQ4cOubVJT0/X0aNH81zXJJl1TxEREW4bAAAAABRWsQpKe/fu1ZEjR1StWjVJUnx8vFJSUrRhw4bsNl9//bUyMzPVqlUrX3UTAAAAQAnn0al3J06cyB4dkqSdO3dq06ZNqlixoipWrKhnn31W3bp1U0xMjH7//XcNGzZMderUUWJioiSpQYMG6tSpk/r06aNp06bp3LlzGjhwoO6++24q3gEAAADwGIdlWZanLr5ixQq1b98+x/GePXtq6tSp6tq1qzZu3KiUlBTFxsaqY8eOev755xUdHZ3d9ujRoxo4cKAWLFiggIAAdevWTW+88YbKlStX6H44nU5FRkYqNTWVaXgAAABAKVbYbODRoFRcEJQAAAAASIXPBsVqjRIAAAAAFAcEJQAAAACwISgBAAAAgA1BCQAAAABsCEoAAAAAYENQAgAAAAAbghIAAAAA2BCUAAAAAMCGoAQAAAAANgQlAAAAALAhKAEAAACADUEJAPzF/PnSAw+4H7Ms6cQJyeEwX8+d++vfp1w5cy1J2r5dqlkzZxunU1q0SHrvvb/+/QAAKIYISgDgL1aulGJipH//W3rxRalrV6lKFemf/zTnf/1VatlSOnpU2rVLCgw07WNiTPgpV861Hxho3hsTI1WsKLVpU/D3X7NGuvlmqXZtKSpKuvtuadYsz90vAAA+RFACAH/x2WdSgwbSo49K06dLycnSu+9Kd95pzl92mdS8uZSYaEaEqlQxbZKTpccfN1vWflyctG6deT1vnut71KsnnTwpVa9uwlDz5tLu3VKTJlJSknTsmDRligliTqf09de++JMAAMDjCEoA4A/WrTPT6u67T9q714Slpk2l//s/qVIlKSBAysyUpk2TOnWSwsMv7vts2yaVLWu+R0qK9MMPUo0a0k8/mfN165rr16hhpvsBAFBCBfm6AwCAQpg6Vbr66rzPh4SYoBQcLD3/vBnx+SuuuMIEofR0Kei8HxWWZY6dLzCQ0AQAKHEclmVZvu6EpzmdTkVGRio1NVURERG+7g4AXJjkZKlWLalzZzP1beVKE1gsy4wkSVJGhgksWe66S/roI7P+SJKOHDFtK1TIef1z56TGjaVvvjH75cqZ71munCnmkJBggtesWdL99+d8/4IFZu0SAAB+oLDZgKl3AFDcPf+8VLWqeb1smRnRefllqW9f8zo93aw52rrVvD5+3BR4OHzYbEuWSJGRZo1T1jH7tmhRwf3IzDRhbfly6dVXpSuvNK/j4z17/wAA+ABT7wCguDt0yISl//wn57nMTDPKVKWKqXZ39KgZHfrvf011ut9/l266yYSne+/N+3scPOi+n9vUu5MnpTp1pHbtzH5UlOs1AAAlDCNKAFDczZolxcaa16mp0ldfmel3n35qpta9/LIp833ggCny0LGjCUmLFkmtW5tqd8ePm+IM528HD5p1Tx06SKGh7t9zyxYz3W7FCtexlBSJ6csAgFKCESUAKO7KlnW97tnTTLErV848M2n6dCk6Who0SBo1yowAffutGYF6+WVp9mxp82YTiObOlRo1Mtc5fVq64w4zGvXJJ67rV65sRo6yHjKbmWnCWZMmZqpdQoK37hoAAJ8iKAGAP5k3z1S4e+0181yj6GgTZo4elf78U/r+ezPyExcnrV1rnot0yy1mJOjaa6XJk01p7969zXOXvvrKrF/Kcviwef+WLWY06tVXpYcflsLCpIYNpUce8dGNAwDgXUy9AwB/EhLivv/rr2aUZ9MmU/UuNlZavFhas8aEpCwDB5qQc999Jjg98oj0+edmnZFd797SjBnm9bffSvfcY56vdOCA1KKFp+4M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SQoKClJMTEyO46mpqZoxY4Y+/PBDXX/99ZKkmTNnqkGDBlqzZo2uueYab3cVAAAAQClQLEaUfvvtN8XGxqp27drq0aOHdu/eLUnasGGDzp07p4SEhOy29evXV40aNbR69eo8r5eWlian0+m2AQAAAEBh+TwotWrVSrNmzdLixYs1depU7dy5U23bttXx48eVnJyskJAQRUVFub0nOjpaycnJeV5z7NixioyMzN7i4uI8fBcAAAAAShKfT7278cYbs183adJErVq10qWXXqp58+YpPDz8oq45YsQIDRkyJHvf6XQSlgAAAAAUms9HlOyioqJ0+eWXa/v27YqJidHZs2eVkpLi1ubgwYO5rmnKEhoaqoiICLcNAAAAAAqr2AWlEydO6Pfff1e1atXUokULBQcHa9myZdnnt23bpt27dys+Pt6HvQQAAABQkvl86t3jjz+uLl266NJLL9X+/fs1atQoBQYGqnv37oqMjFTv3r01ZMgQVaxYUREREXrkkUcUHx9PxTsAAAAAHuPzoLR37151795dR44cUZUqVdSmTRutWbNGVapUkSS9+uqrCggIULdu3ZSWlqbExERNmTLFx70GAAAAUJI5LMuyfN0JT3M6nYqMjFRqairrlQAAAIBSrLDZoNitUQIAAAAAXyMoAQAAAIANQQkAAAAAbAhKAAAAAGBDUAIAAAAAG4ISAAAAANgQlAAAAADAhqAEAAAAADYEJQAAAACwISgBAAAAgA1BCQAAAABsCEoALtqRI0V3rbNni+5a+Tl5Ujp3zjvfCwAA+C+CEoCL8t57Ups2kmWZ/eHDzZYlLc2EkvzccIO0bJn08cdS//65t3ntNffrFta990qzZuU83q2b9NlnF349AABQuhCUAFyww4elIUOk0aMlhyPn+aNHpYQE6dln879OxYqS0ynddJO0cWPBwUqSbrlFqlzZbKGhUrlyrv2dO6Uff5QWLLjwe0pKMvdS2G306Av/HgAAwH8E+boDAPxLerrUu7cJJnfdlfP8ypXSAw9IV14pPfOMOfbVV9KNN0ply7q3TUszozthYWb/kkvM1x07pCZNzPc6dUrKzHSNDiUnu95/zTXS009LN9/sOvbyy9KePe7fp3lzafdu89rplL77TurXz+x37y5NmuRqe+yY+b5BufzrePq0tH+/dNllrj4DAICSiaAEoNDS002wWLxYatw45/kPPpCmTZNeeEEaMMB9tCkxUVq40L39Rx9Jn34qzZtnQtMDD0ivvmpGmvbuNW1ee82Eo3HjzP7Jk9Jvv5nwtGmTVKmSGQ2KipJiYqTt26VVq0wg+uUXaf58E4yygk2nTtKDD0q33577PUZFSbfdZoKafdToiSekn36S1q69kD81AADgjwhKAArtmWek7783IzBvv23WJy1fLr31lgkkV11lQk/WyNDkyWZk6exZ6csvzShUlnvvNdcbMMCM0gwYIEVGSsePm3ZPPCFdcYWr/SefmO/Rr5+ZftesmVkj9cwzJkhdc400fbq0erU0cKD0739LLVqYYBQcfGH3OW6cmTq4e7f0zjtSYKD04YfS3Lnm/gEAQMnHGiUAhdaliwlGtWub/SFDpI4dzeubbpLatnWFJMkUakhKMoGjXz+ztunwYTNdLjzcjAbdfLMZvTl3zgSugQOlzz+XMjLMqFFumjUz0/maNjVBJqvYw9690pYt0t//LkVHS/Xrm1Gl6GjXOqavvzYjV1n7lStL337rfv3LL5f++18zMtWtm3ndp480e7a5JgAAKPkISgAKrXVrV0iSTFDavt2MtFx9tZkKd+aMOXfggBndadZM+s9/zOjP8eNmdOmbb6RLLzUh6scfTfGHZ54xxRm2bDFrigrjm2+k1FTXftmyUq9e7muhHn7YFdAOHzbf3+k033vPHnPs2mtzXvvSS01A+u036brrTBi79dYL/RMDAAD+iqAE4IIFBJhiB3FxUs2aZt1OmzbSn3+a9UVhYVKDBiZYHDpkwtD//Z8ZOapc2YSozZulDh1MWfBJk8xo1QMPmJATG2u+z7ZtJojt3m0ClF1mpnvRhQoVzAjT6dMmAL3zTu4hSDJT/woqE37ypHTihBQRYaYOnjhxUX9cAADAD7FGCcAFu/56ac0a1/748WYa3IYNOduuWSPNmGHC086druMffmjKh1eqZPZbtDBh5PHHzX7Tpqb4w/btZpRqxw6pTh33ax87ZtY1ZTlxwkzxW7jQrJ/q21fq0cMUaLA7edKMGPXrZ4pQXHaZ+/lffjHrlP7v/0w/r7vOFKRYvFgqX76Qf1AAAMBvMaIEoNB69zYjOPbtww+lJ5/M/dx335n3hoSYwFK+vDn+8MNmGl9goDneqZP0yitSw4amfa9epoBDr15S165mmt2MGa6+pKaaEazz10SFh5v9H34wI1RXXGEC12+/SS++KKWkuLYOHcz1UlKkzp3d73PBAik+3qxPmjrVrHH66itTdCIx0UzdAwAAJRtBCUChzZhhSoTbt3vukV56KfdzQ4aY9952mwkly5ebaXopKWY6Xd26rvCSn6AgMwoUG2uC08yZJiyNGyfVq2dGuQIDTT/OX0clmUIRo0aZkaOCfPutmTL49NNmSmBWifPq1U1Y2rVL+te/LuRPDQAA+COm3gEo1tLTpX37zDS6DRvM1qSJGTH65BNTZOHgQen11/O+RmysCVbPP29C3fnPd7Jr0cKMXjVt6ipMkeWSS8wzlKpUMeHrQsuOAwAA/0FQAuBRLVtKP/9sAk+5cqYAQ1qaeW1ZpvBCuXKm7cmT5vVTT5lNMiM8X30lDR4srVhhCjQMGWKe0dStmynWcN11pijElCl5h6CbbzbPedq927T59dfc1xqFhxfuvrLWKwEAgJKJoATAo/7qA1qfeMKEothYM8KzdKmZenfokPT776YIw9Kl0htvmBAWGJj3tX74waxHCggwD6ht3951rn59E9wAAAAkyWFZJf+/Bk6nU5GRkUpNTVVERISvuwPgIixYIPXsaSrdBQebUJSZaabSTZ9uquoVhmXlP/UOAACUbIXNBowoASj2vvnGFFjIzDT75865zn30kdmfO7dw1yIkAQCAwqDqHYBi79lnzdfcxr8zM6V588xzjwAAAIoKQQlAsXbsmCnmkJGRd5ugoMKPKAEAABQGQQlAsZaaWnAbh6Pg5zABAABcCIISgGItOrrgQg3p6ab6HQAAQFEhKAEo1sLDpV69zPS6vAQHS/fe67UuAQCAUoCgBKDYGz1aqlYtZ1jKqmD3xhtSxYpe7xYAACjBCEoAir3oaGntWvPMpOBg1/ErrpD+9S/poYd81zcAAFAy8cBZAH4lJUXatUsqX16qXZvnIgEAgAvDA2cBlEhRUVLTpr7uBQAAKOmYegcAAAAANgQlAAAAALAhKAEAAACADUEJAAAAAGwISgAAAABgQ1ACAAAAABuCEgAAAADYEJQAADkdOSLl9jzy9HQpLc37/QEAwMsISgCAnJ57TkpIkA4ccB1LTpY6dJCeftp3/QIAwEsISgAA4/Rpae9esz3+uFSjhvTuu65jfftKtWpJAwa4jv3yi+RwSEFBBW+BgVK7dr6+SwAACiXI1x0AABQT335rAtL5Nm6UXn/dTMO75BJp926pa1fX+QcekCpVkg4fLvj6CxdKEycWaZcBAPAUghIAwEhIkDZtynn88cfN2qTXXst5btcuM01v2TKpW7e8r92smTR0aBF1FAAAz2PqHQDAZexYqXJl923KFOmtt3Ie79vX9b4OHaSUFNfWqJE0f75rf/lyX9wNAAAXjRElAIDLiBFmO19BI0oAAJRABCUAwF+XlmbWMGVJTZVuuUUKDjb7Q4dKjRv7pm8AAFwEghIAwHjkEemjj/I+//77OY/Fx5uvoaHuBR3atJFeeEFKSpJ69ZLCwkwxBwAA/ARBCQBgTJpkNrvXX5dOnpSeeirnuV27pKuuyvuaa9ZIa9dKM2cWWTcBAPAGghIAwJg6Nef6JEk6dco8A2n8+JznCnr47JtvSl98UTT9AwDAi6h6BwAw+vd3r1yXkiJNmCA1aGDKe7/8cs7zt99u3jt+vHtFvKQkc65mTXPdypWljAyf3BYAABeDESUAQE6nTknjxknvvCMtWSJVqCB17CitXy+NHi1FR7u3HzbMbPlhjRIAwI8QlAAAxvbt0rffSqtWSf/6l3TNNWaN0aWXmvNr15qpeZddJrVqJV19tVS/vnTkiCnWUJDMTKl1a8/eAwAARYSpdwAA48cfzQhStWomLC1e7ApJkhQRIU2eLP3+u5SQIC1YYNY1BQdLI0dKf/whnTmT9/bvf/vu3gAAuEAOy7IsX3fC05xOpyIjI5WamqqIiAhfdwcA/NuCBdIdd5iH0GatOwoIMKNK8+dLN9zg0+4BAJCfwmYDRpQAAIX3229St27S2bPuxRkyM82o0f/9n7R7t+/6BwBAESEoAQAK7803TSjKbTJCZqZ07pz01lve7xcAAEWMoAQAKLxFi/Iv852RQXU7AECJQFACABTeuXNF0wYAgGKOoAQAKLxrr5WC8nmyRFCQ1KaN9/oDAICHEJQAAIU3cKCpdpeX9HTp4Ye91x8AADyEoAQAKLzWraWxY83r80eWsl6//rrUtKnXuwUA8J78lqqWJH4TlCZPnqyaNWsqLCxMrVq10vfff+/rLgFA6TR8uPTVV1KnTlL58ma7+WZp5Urp0Ud93TsAQCH06SNNnOjar19fWrGi4Pdt2ybVqSMdPeqxrhUb+Uw0Lz7mzp2rIUOGaNq0aWrVqpVee+01JSYmatu2bapataqvuwcApU+HDmYDAPilc+fyn0ktSX/+KaWluR8rW1aKiZFeeUXq1y/neyIizFYS+EVQeuWVV9SnTx/df//9kqRp06Zp0aJFevfddzV8+HAf9w4AAAAoWTZvlsaPl/KaxPXJJ2azGzjQbCVBsQ9KZ8+e1YYNGzRixIjsYwEBAUpISNDq1atzfU9aWprSzou/TqfT4/0EAAAA/N2hQ9KQIdLcudLPP5speaVVsV+jdPjwYWVkZCg6OtrteHR0tJKTk3N9z9ixYxUZGZm9xcXFeaOrAAAAQLE0fLjkcLi22bNztvnwQxOM9u+X1q93haTKlaWoqPy3u+/2zn14U7EPShdjxIgRSk1Nzd727Nnj6y4BAAAAPvPii2ZdUtb297/nbLN+vfTBB9LXX0tXXuk6npIi7dplvua2vfmmdOKE5+/B24r91LvKlSsrMDBQBw8edDt+8OBBxcTE5Pqe0NBQhYaGeqN7AAAAQLEXEGC2LA5HzjavvCK1a+e1LhV7xX5EKSQkRC1atNCyZcuyj2VmZmrZsmWKj4/3Yc8AAAAAlFTFfkRJkoYMGaKePXvqqquuUsuWLfXaa6/p5MmT2VXwAAAAABSdY8ekChXM6+uuky67zPWg2dOnzYhUWJjZr1ZN6tnTN/30JL8ISnfddZf+/PNPjRw5UsnJyWratKkWL16co8ADAAAAgPytWCFt2JB/Rbvx46XUVGnKFGnZMlMu/IorTEAaNMiEpHHjzLqmJk2kkBBv9d57iv3UuywDBw7UH3/8obS0NK1du1atWrXydZcAAAAAv3DwoPTyy1KDBqZC3alT+bdPTpYiI83r11+XWraU1q7N2e7RR6W2baXdu4u+z77mN0EJAAAAwMV58knpX/+SnnnGhJq2bd3Ply9vRo0sy4Sk5ctNqOrRQxo1SvrPf6Rrrsl53cWLperVpebNzeuShKAEAAAAlHBvvSV99510zz25T5N77DHzrKWAALPm6JJLzBS9n36S1q2TEhKkI0ek48elpCQpq8B0RIQJYAMGmJLjBY1U+ROCEgAAAFDCFfTknHvvNSHo+HHpzBmzNunKK81IVOXKpk2LFiYY/fij1LWr+/uffdYcL1PGI933Cb8o5gAAAACg6MyalfOYwyHt3WtGhtatcx0PDZUeftiMJAUFmS031ap5pKs+Q1ACAAAAoN27pWuvNdXuzpeWJr32mvTnn9I//+mTrvkEU+8AAAAAaNw4yel0PS/pfJYlvf++tHGj9/vlKwQlAAAAoJTLzJRmz5bS0/NuExQkvfee9/rkawQlAAAAoJQ7fbrginVZpcNLC4ISAAAAUMqFh0vlyuXfxuEwZcNLC4ISAAAAUMoFBEgPPCAFBubdJj1d6tXLa13yOYISAAAAgOxnJuVW/tvhkPr0kRo18n6/fIWgBAAAAECxsdLq1dLf/uZ+vFw56ZlnpKlTfdMvX+E5SgAAAAAkSbVqScuWSdu3Sz//LIWFmeBUtqyve+Z9BCUAAAAAburUMVtpxtQ7AAAAALAhKAEAAACADUEJAAAAAGwISgAAAABgQ1ACAAAAABuCEgAAAADYEJR87Nw5afNmac4cafz4nOdfe03q1cvbvQIAAABKN4LSeUaPlhyOwm3Tp0sdOkhBQe6bw5H766xtyhTp1VelG26QateWypSRGjeWuneXnnpKOnky7/49+GDh++dwSG3aeO2PDgAAAChRCEo23btLx465tvvuk5580v1Yhw6m7bJlUnq6a/vuOxN+0tOlEydMm5QU9zYPPyxVrCg1aiQ99JBpP3Gi9Pvv0unT5qnH995rgpjdtGmmTdbWurX09tvm9ZIlUo0a7ue//tprf2wAAABAiRLk6w4UNyEhUlSU+35YmPuxoDz+1NLTpcDAgr9Hz55mk6QvvpCuuMIEpoIEBUn79kmXXmr2HQ4pONj0LyTE7IeFmXMHDkhVqhR8TQAAAAA5EZT+osqVzahRlowM9yB1fsCqWVPavl16/HHXsd9/N6NHX31l9u+5J+/v9c03ZoRrxw4TivLTv78JYGPGFPJGAADFW0qKVKGCZFmuY4cPSzEx5jd1AIAixdS7vyg9XUpKMl/fe09q1y73qXdr1rh+jlWvbrawMGnvXhO2so6VKZP397r2WnONFSvy79OxY9LixdJddxXBDQIA/MuuXbkvks1tCww0P7gAADkwomQze7bZ7J591n3/9ttzttm8Wapbt+DvMWiQ+frkk+Zr27Ym1OQ1pS+LwyH16CHNmiW1b593uzlzpCZNzAYA8GP9+0szZ7ofy5pjnSUjw/1Yly5SpUpmtKkgCxeahbIAgBwYUbKxF3PIbRs1SqpVy/19mZnSvHnm51Nh/Pmn9NFHUrNmZnrcbbdJZ84U/L4775T+9S/XiFVu3n5b6tevcP0AABRjU6eaHw5nzkjJyebYmTPS6tXSunVmWkJgoKvNmTPShAmm3bJlZv53Xlt+v3EDABCU7LKKOeS3jR7tqnyX5bXXzHs7dTL7wcFSQIC0c2fu3+fJJ6W+faWICGncOHMsMVFyOvPvX/PmpkjDxx/nfv7bb6Xdu03gAwCUIOXLm3AkmakPc+eaH0pr1+bevkMHM/87a2vUSJo/37W/fLkXOg0A/oupdxfpscdcU9vmz5eee05autQEJMn8gu/ee6UWLcxok2TWIElmJOnzz6VffzVFHEJCTPB56KH8R4qyDBkiVauW+7kDB6Thw6Xw8L90ewCA4iQszDw/IquSz8mT5rdx06aZ/YwMM91u+3bf9REAShhGlC7Szz+bZxVJZo3R4sVSq1bubWbPls6edRVzkEyxosGDpXfeMaNJWUJDzdqj2FhTtKFOnby/9yOPuEau7G6/XXriiYu+LQBAcbVtm1l3dPiw1KeP+a1Y1n5uo0NpaaZaUNa2dq10yy2u/bFjvX8PAOBHGFE6T3i4qWB36lT+1eeSkqT1611T5ipVyj/YnM/hMIEor6AjmbW7Wc6vAptb9dfMTHM8IyP3NoGBBZcSBwD4mYyMgh/cFxrqXtChTRvphRfMD7Fevcwo1cKFHu0mAPgzgtJ5unSRXn7ZzG7Ij8Mh3X231LKl2a9fv3DXz5p6l19IkqRz56TvvzcjTl99ZULY9u25V9T79lupd2/XftbUvyxLl0oJCYXrHwDAT6SlFVwqNS9r1pjRJXs1PQCAG4LSeRo2lA4eNAUVzh/JsStTxqwrypKUVPCI0ttvmyl3VaqYaeWJiWadU26Cgky58JMnpRo1pPHjzfXz6xMAoAS67z7p00/ND4aaNV3Hs9YoPfece/ty5czIUX7efFP64osi7yoAlDQOyyr5//12Op2KjIxUamqqIs5fGOQlL71kppIHBbmmxgUFmZkTM2dKPXt6vUsAAH81d670/PPmh8js2a7pDVl27ZKuukoaNsz8pi0/M2ZIr75a8JPMAaAEKWw2oJiDh33zjQlJkvv6ofR0M0L0wAOm+h0AAPnKzDSh5tFHTUCaNk3q1k1atCj39sOGuYo95LUVtM4JAEoxpt552BtvuI8k2QUEmOcJvvqqd/sFAPATx45Jn3ziWkS7YoXUoIE5N3eueXBe7dpmesI115jFqkeOmGINBcnMlFq39mj3AcBfMaLkYatW5R2SJHNu1Srv9QcA4EcmTpSio80UuZEjTcnVrJAkmZDz229mXdLw4ebcFVeY39C99555jsWZM3lv//637+4NAIo51ih52CWXSPv359/m6qtNlTsAANykppofIueHI7sFC6TbbjOvs34zFxBgRoseeECaPp3nRADAeVijVEx06pR/BdfAwILLhQMASqnIyPxD0pEjpkxqRob79IXMTPP13XfNyBIA4IIRlDzsscdcP6/sHA4zlfyhh7zbJwBACTFzpnmmUl6TQwICpNde82qXAKCkICh5WJMm0j//aUaOzi8uFBho1tl+9pmZngcAwAUraN52Zqa0aVP+i2UBALmi6p0X3HOPKUQ0bZq0cqWZinfDDVLfvlJsrK97BwDwW0FBBa8/CggwGwDgghCUvKR27YKf+wcAwAXp2FH66KO8zwcGStdfT1ACgIvAv5wAAPiru+6SYmLyfnBsRob0xBPe7RMAlBAEJQAA/FV4uPTll1KlSmYKXtY0vMBA83rSJDPXGwBwwZh6BwCAP2vcWNq+XXr/fVMh6PRp6aqrTEnVyy/3de8AwG/xwFkAAAAApQYPnAUAAACAi0RQAgAAAAAbghIAAAAA2BCUAACA38vI8HUPAJQ0BCUAAODXLEtq2FD6/nvXsePHTdX0kSNzf8+uXdIHH+Q8vnZt7scBlD4EJQAA4NfWr5d27pTq1XMde/11KShIeucd6eTJnO+JiJAef1zautX9+KefStu2eba/APwDQQkAAPi1jz+WOnSQIiPNflKSNGaMGRlq0sQEoix//7tUv77UurVpf+utZr9+ffO+JUuk2FhpzRrX9uefvrkvAL7FA2cBAIDfysgwz9qdMMHsp6ZKd90lde8uJSRItWtLzZtLLVtK998vvfde3tf69Vdp0yapf3/34zNnSr16eeoOABRXBCUAAOC3Pv1UOnDAhKLUVKlLFzPlbtIkc752bWnWLOnOO6W0NKlfPyk0VKpb13WNPXukzz6TPvlEuvdeM11Pkh57TKpRQ7rvPq/fFoBigKAEAAD81sSJ5uupU1L79ub1ihVS2bKuNl27StOmSX36SCdOSOXLS5s3u87ffru0Y4c0fboUHy+FhZnjO3ZInTtLgYHeuBMAxY3DsizL153wNKfTqcjISKWmpioiIsLX3QEAAEVg/nzpjjuk9HSzjujtt6UWLaSNG6Xhw13t0tKkgweln3825y+9NOeI0i23mAIPc+ZIhw5JDoepmrd1qxQd7fVbA+BBhc0GjCgBAAC/NHOmmR738stm/6mnzPS5xYtdQWnbNjN1Li5O+te/zLEvvpCuv951nU2bpEsukcLDTZhavVoKCTHHCElA6UXVOwAA4Jd69ZKefz73c8eOSU8+KV19tZk+N2eOOf7jj9LDD7sq3dWoITVrZsJTuXJmGt5bb0mzZ5v1SgBKL0aUAACAX7r11tyP//yzVKuWlJhoyns3bChlZppzV15pyoBLpnz4++9L48dL114rnT0r9e5t9jMz3dcxASh9CEoAAKBEiYqSFi0yI0ZZvv/ejDDFxkpr10rHj0tOp1mHNHGiNGOGqY6Xni6dOyeVKSMFMO8GKNUISgAAoESJi3MPSZK0d68JQM8+a9YfxcRIDz5oKuLdfrtpc+SI1KaN1K2btH271KOHKRtO1TugdOJ3JQAAoMSIjJR27TLB6MQJsx09ap631LChdPnlpkBDcLD0xx+uMuKLFklNm5pt0iTpww+lLVtM0Yd9+3x4QwB8hqAEAABKjLZtpTp1zFa+vNmqVjWV7A4cMEGqfHnzUNpdu6TWrc3X7t2lRx81ASkgwEzJ++476eRJVyEIAKULz1ECAAAl2rx50j33mGcjpaebYwEBpmBD377mYbQpKVKFCjnfe/q0FBrKeiWgUO69V6pZU3rhBV/3JF+FzQY+/Wtfs2ZNORwOt23cuHFubX766Se1bdtWYWFhiouL0/jx433UWwAA4G8OHDD/d8vIcIUkyVUF7+23zYhRbiFJMs9WIiQBRWDXLvPbiqCggrfAQKldO1/32PdT75577jkdOHAge3vkkUeyzzmdTnXs2FGXXnqpNmzYoAkTJmj06NF6++23fdhjAADgL6ZPNyEpLwEB0uuve68/QKlWqZL5jUVB22ef+bqnkopB1bvy5csrJiYm13MffPCBzp49q3fffVchISG64oortGnTJr3yyivq27evl3sKAAD8zfffu0aPcpOZKW3Y4L3+ACVGnTrS77/nfm7MGPf9664z9fcladkyU1oyL82aSUOHFkkX/yqfjyiNGzdOlSpVUrNmzTRhwgSlnzcuvnr1av3tb39TSEhI9rHExERt27ZNx44dy/OaaWlpcjqdbhsAACh9goPNbJ/8BPn818aAn/rqK1N3P2u75x7pqafcj82e7f6eDh3MosCsrVEjaf581/7y5d6+izz5NCg9+uijmjNnjpYvX66HHnpIL774ooYNG5Z9Pjk5WdHR0W7vydpPTk7O87pjx45VZGRk9hYXF+eZGwAAAMVap075nw8KKrgNgDwEBrqvLXI4cq5D8uNFfkXe8+HDh+co0GDfkpKSJElDhgxRu3bt1KRJE/Xr108vv/yyJk2apLS0tL/UhxEjRig1NTV727NnT1HcGgAA8DP33CNVrpz3Q2MzMorNLB+gdEhLM38ps7a1a6VbbnHtjx3r6x5mK/LB5qFDh6pXr175tqldu3aux1u1aqX09HTt2rVL9erVU0xMjA4ePOjWJms/r3VNkhQaGqrQ0NAL6zgAAChxypWTli6VEhKkI0fMMcsywcmypHfekdq08W0fAb9lLydpWWbLrcRkltBQ6fBh136bNqaceFKS1KuXFBYmLVzo0W4XVpEHpSpVqqhKlSoX9d5NmzYpICBAVatWlSTFx8frH//4h86dO6fg4GBJ0tKlS1WvXj1VyKuOJwAAwHmuvFLasUN6/33z/6+0NOnqq6WHHjKPfAFwkRIScj/+4ovu+9ddV/C11qwxo0szZ/71fhURn00aXL16tV577TX9+OOP2rFjhz744AMNHjxY9957b3YIuueeexQSEqLevXtry5Ytmjt3rl5//XUNGTLEV90uXUaPds01LWibPt0szrPXwT9/nmputfOnTPH1XQIASoHy5aX+/aVFi8z687FjCUnAXzJ3rim+kDWKZFlSjx7SP/7hfuzQIWnSpIKv9+ab0k03ebzbF8JndV5CQ0M1Z84cjR49WmlpaapVq5YGDx7sFoIiIyP15ZdfasCAAWrRooUqV66skSNHUhrcm7p3dw8zjz4qxcZKw4e7jt1+u/m6bJn7e7//3rz/99+lM2fMU/tSUsw8CAAAAPivFi0K165KFbPt2mX2x4832/my/i8pmd9ozJhRJF38q3wWlJo3b641a9YU2K5Jkyb673//64UeIVchIVJUlPt+WJj7sbzqqqan5716FgAAAKXPsGFmy09JXaOEUq5yZTNqlCUjwz1InR+wataUtm/3UscAAADgE+npktNpKqqEhRXcPjNTat3a8/0qgP8WNkfxlJ5uqpakp0vvvSe1a2denzhhzqekmP01a9wrogAAAKBk+eMPUzUlIsJUVZFMZbtffzXL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",
      "text/plain": [
       "<Figure size 1000x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.manifold import TSNE\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from matplotlib.font_manager import FontProperties\n",
    "\n",
    "chinese_font = FontProperties(fname=\"./微软雅黑.ttf\")\n",
    "\n",
    "\n",
    "def tsne_plot(word: List[str], embedding: List[float]):\n",
    "    \"Creates and TSNE model and plots it\"\n",
    "    embedding = np.array(embedding)\n",
    "\n",
    "    tsne = TSNE(n_components=2, random_state=0, perplexity=7)\n",
    "    embedded_vectors = tsne.fit_transform(embedding)\n",
    "\n",
    "    plt.figure(figsize=(10, 8))\n",
    "    colors = []\n",
    "    for i in range(len(word)):\n",
    "        colors.append(\"r\" if i % 2 == 0 else \"b\")\n",
    "    plt.scatter(embedded_vectors[:, 0], embedded_vectors[:, 1], c=colors)\n",
    "\n",
    "    for i, label in enumerate(word):\n",
    "        x, y = embedded_vectors[i]\n",
    "        plt.annotate(\n",
    "            label,\n",
    "            (x, y),\n",
    "            textcoords=\"offset points\",\n",
    "            xytext=(0, 5),\n",
    "            ha=\"center\",\n",
    "            fontproperties=chinese_font,\n",
    "            color=\"r\" if i % 2 == 0 else \"b\",\n",
    "        )\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "tsne_plot(word, return_embedding)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.0"
  },
  "vscode": {
   "interpreter": {
    "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
